#include "Int_OlLED_Image.h"
#include "Dri_Timer_0.h"

code u8 page_0[64] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
code u8 page_1[64] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x06, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x60, 0x20, 0x10, 0x08, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
code u8 page_2[64] = {0x00, 0x00, 0x06, 0x18, 0xe0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x18, 0x38, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x0c, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
code u8 page_3[64] = {0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1c, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
code u8 page_4[64] = {0x00, 0x00, 0xc0, 0x18, 0x06, 0x01, 0x00, 0x00, 0x02, 0x06, 0x0c, 0x1c, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x04, 0x04, 0x08, 0x30, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0xc0, 0x40, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
code u8 page_5[64] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x30, 0x18, 0x0c, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x08, 0x10, 0x20, 0xc0, 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
code u8 page_6[64] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
code u8 page_7[64] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

/**
 * @brief 坐标设置
 *
 * @param y
 * @param x
 */
void Int_OLED_Image_coordinate(u8 y, u8 x)
{
    u8 commandArray[5];
    // 发送相应的命令
    // 页寻址
    commandArray[0] = 0X20;
    commandArray[1] = 0X02;
    // 开始页
    commandArray[2] = 0Xb0 + y;
    // // 开始列
    // // 低4位
    commandArray[3] = 0X00 | (x & 0X0f);
    // 高3位
    commandArray[4] = 0X10 | (x >> 4);

    // 3. 设置列地址
    //  commandArray[3] = x & 0x0F;       // 发送低4位，column_addr & 0b00001111 高4位变0，低4位不变
    //  commandArray[4] = 0x10 + (x >> 4);    // 发送高3位

    Int_OLED_SendCommand(commandArray, 5);
}

/**
 * @brief 显示相应字符串数据
 *
 * @param data_Array 字符串
 * @param array_len 数组长度
 * @param y 上下纵坐标
 * @param x 左右横坐标
 */
void Int_OLED_Data_Image_Show(u8 *data_Array, u8 array_len, u8 y, u8 x)
{
    // u8 i;
    Int_OLED_Image_coordinate(y, x);

    Int_OLED_Image_Init(data_Array, array_len, 1);
}

/**
 * @brief 初始化数据
 *
 */
void Int_OLED_Image_Init(u8 *array, u8 lenth, bit is_data)
{
    u8 ack;
    u8 i;
    // 准备开始
    Dri_I2c_Start();
    // 发送地址
    Dri_I2c_SendByte(OLED_ADDER_W);

    ack |= Dri_I2c_Receive_Ask();
    // 发送控制字节
    // 1. Co = 0 连续,, D/C# 写入数据还是命令
    if (is_data == 1) {
        Dri_I2c_SendByte(0x40);
    } else {
        Dri_I2c_SendByte(0X00);
    }
    ack |= Dri_I2c_Receive_Ask();

    // 批量发送数据
    for (i = 0; i < lenth; i++) {
        Dri_I2c_SendByte_Image(array[i]);
        ack |= Dri_I2c_Receive_Ask();
    }

    Dri_I2c_Stop();
}

/**
 * @brief 让图片动起来
 *
 * @param x
 */
static u8 i = 5;
void Int_OLED_Image_Do()
{
   
    if (SW1 == 0) {
        if (i >= 64)
        {
            i = 64;
            return;
        }
        
        Int_OLED_Clear();
        Int_OLED_Data_Image_Show(page_0, 64, 0, i);
        Int_OLED_Data_Image_Show(page_1, 64, 1, i);
        Int_OLED_Data_Image_Show(page_2, 64, 2, i);
        Int_OLED_Data_Image_Show(page_3, 64, 3, i);
        Int_OLED_Data_Image_Show(page_4, 64, 4, i);
        Int_OLED_Data_Image_Show(page_5, 64, 5, i);
        Int_OLED_Data_Image_Show(page_6, 64, 6, i);
        Int_OLED_Data_Image_Show(page_7, 64, 7, i);
        i += 5;
    }
}

/**
 * @brief 让图片向后动起来
 * 
 */
void Int_OLED_Image_Back(){
    if (SW2 == 0) {
        if (i <= 5)
        {
            i = 0;
            return;
        }
        
        Int_OLED_Clear();
        Int_OLED_Data_Image_Show(page_0, 64, 0, i);
        Int_OLED_Data_Image_Show(page_1, 64, 1, i);
        Int_OLED_Data_Image_Show(page_2, 64, 2, i);
        Int_OLED_Data_Image_Show(page_3, 64, 3, i);
        Int_OLED_Data_Image_Show(page_4, 64, 4, i);
        Int_OLED_Data_Image_Show(page_5, 64, 5, i);
        Int_OLED_Data_Image_Show(page_6, 64, 6, i);
        Int_OLED_Data_Image_Show(page_7, 64, 7, i);
        i -= 5;
    }
}